from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time
import base64
from openai import OpenAI

def find_element_by_vision(prompt, image_path):
    """
    使用AI视觉模型找到元素位置
    """
    # 初始化OpenAI客户端
    client = OpenAI(
        api_key="sk-531943d051864948bce3b7c335ed7c87",
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
    
    # 读取图片并转换为base64
    with open(image_path, "rb") as image_file:
        img_str = base64.b64encode(image_file.read()).decode('utf-8')
    
    # 创建聊天完成请求
    completion = client.chat.completions.create(
        model="qwen-vl-plus",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/png;base64,{img_str}"
                        },
                    },
                    {"type": "text", "text": prompt},
                ],
            },
        ],
    )
    
    # 返回AI的回复
    return completion.choices[0].message.content

def main():
    # 设置Chrome选项
    chrome_options = Options()
    chrome_options.add_argument("--start-maximized")
    chrome_options.add_argument("--disable-blink-features=AutomationControlled")
    
    # 初始化WebDriver
    driver = webdriver.Chrome(options=chrome_options)
    
    try:
        # 打开登录页面
        driver.get("http://novel.hctestedu.com/user/login.html")
        
        # 等待页面加载
        time.sleep(3)
        
        # 截图保存
        screenshot_path = "login_page.png"
        driver.save_screenshot(screenshot_path)
        
        # 使用AI视觉模型找到账号输入框并输入账号
        username_prompt = "帮我找到图中账号输入框的位置，返回坐标（x,y），只给数字，比如\"100,200\""
        username_pos = find_element_by_vision(username_prompt, screenshot_path)
        print(f"账号输入框位置: {username_pos}")
        
        # 解析坐标并点击
        if username_pos and "," in username_pos:
            x, y = map(int, username_pos.split(","))
            # 这里应该使用Selenium的点击操作，但为了演示，我们只打印坐标
            print(f"将在坐标 ({x}, {y}) 输入账号")
            
            # 实际应该使用Selenium定位元素并输入
            # driver.find_element(By.ID, "username").send_keys("18522223333")
        
        # 使用AI视觉模型找到密码输入框并输入密码
        password_prompt = "帮我找到图中密码输入框的位置，返回坐标（x,y），只给数字，比如\"100,200\""
        password_pos = find_element_by_vision(password_prompt, screenshot_path)
        print(f"密码输入框位置: {password_pos}")
        
        # 解析坐标并点击
        if password_pos and "," in password_pos:
            x, y = map(int, password_pos.split(","))
            # 这里应该使用Selenium的点击操作，但为了演示，我们只打印坐标
            print(f"将在坐标 ({x}, {y}) 输入密码")
            
            # 实际应该使用Selenium定位元素并输入
            # driver.find_element(By.ID, "password").send_keys("123456")
        
        # 使用AI视觉模型找到登录按钮并点击
        login_prompt = "帮我找到图中登录按钮的位置，返回坐标（x,y），只给数字，比如\"100,200\""
        login_pos = find_element_by_vision(login_prompt, screenshot_path)
        print(f"登录按钮位置: {login_pos}")
        
        # 解析坐标并点击
        if login_pos and "," in login_pos:
            x, y = map(int, login_pos.split(","))
            # 这里应该使用Selenium的点击操作，但为了演示，我们只打印坐标
            print(f"将点击坐标 ({x}, {y}) 的登录按钮")
            
            # 实际应该使用Selenium定位元素并点击
            # driver.find_element(By.CLASS_NAME, "login_btn").click()
        
        # 等待一段时间观察结果
        time.sleep(5)
        
    except Exception as e:
        print(f"发生错误: {e}")
    finally:
        # 关闭浏览器
        driver.quit()

if __name__ == "__main__":
    main()